#!/usr/bin/env perl
require 5.008;
use warnings;
use strict;

unshift(@INC, '.');
require qpdf_test_helpers;

chdir("qpdf") or die "chdir testdir failed: $!\n";

require TestDriver;

cleanup();

my $td = new TestDriver('encryption-parameters');

my $n_tests = 13;

# Encrypt files whose /ID strings are other than 32 bytes long (bug
# 2991412). Also linearize these files, which was reported in a
# separate bug by email.
foreach my $file (qw(short-id long-id))
{
    $td->runtest("encrypt $file.pdf",
                 {$td->COMMAND =>
                      "qpdf --allow-weak-crypto".
                      " --encrypt --owner-password=pass --bits=40 -- $file.pdf a.pdf"},
                 {$td->STRING => "",
                  $td->EXIT_STATUS => 0},
                 $td->NORMALIZE_NEWLINES);

    $td->runtest("check $file.pdf",
                 {$td->COMMAND => "qpdf --check --show-encryption-key a.pdf"},
                 {$td->FILE => "$file-check.out",
                  $td->EXIT_STATUS => 0},
                 $td->NORMALIZE_NEWLINES);

    $td->runtest("linearize $file.pdf",
                 {$td->COMMAND =>
                      "qpdf --deterministic-id --compress-streams=n" .
                      " --linearize $file.pdf a.pdf"},
                 {$td->STRING => "",
                  $td->EXIT_STATUS => 0},
                 $td->NORMALIZE_NEWLINES);

    $td->runtest("check output",
                 {$td->FILE => "a.pdf"},
                 {$td->FILE => "$file-linearized.pdf"});

    $td->runtest("check $file.pdf",
                 {$td->COMMAND => "qpdf --check a.pdf"},
                 {$td->FILE => "$file-linearized-check.out",
                  $td->EXIT_STATUS => 0},
                 $td->NORMALIZE_NEWLINES);
}

# A user provided a file that was missing /ID in its trailer even
# though it is encrypted and also has a space instead of a newline
# after its xref keyword. This file has those same properties.
$td->runtest("check broken file",
             {$td->COMMAND => "qpdf --check invalid-id-xref.pdf"},
             {$td->FILE => "invalid-id-xref.out", $td->EXIT_STATUS => 3},
             $td->NORMALIZE_NEWLINES);

# A file was emailed privately with issue 96. short-O-U.pdf was
# created by copying encryption parameters from that file. It exhibits
# the same behavior as the original file.
$td->runtest("short /O or /U",
             {$td->COMMAND =>
                  "qpdf --password=19723102477 --check short-O-U.pdf"},
             {$td->FILE => "short-O-U.out",
              $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);

# A file was sent to me privately as part of issue 212. This file was
# encrypted and had /R=3 and /V=1 and was using a 40-bit key. qpdf was
# failing to work properly on files with /R=3 and 40-bit keys. The
# test file is not this private file, but the encryption parameters
# were copied from it. Like the bug file, qpdf < 8.1 can't decrypt it.
$td->runtest("/R 3 with 40-bit key",
             {$td->COMMAND =>
                  "qpdf --password=623 --check --show-encryption-key" .
                  " encrypted-40-bit-R3.pdf"},
             {$td->FILE => "encrypted-40-bit-R3.out",
              $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);

cleanup();
$td->report($n_tests);
